package main

import "fmt"

//熟悉切片 slice
func main() {

	// var intArr [5]int = [...]int{11, 22, 33, 44, 55}
	// slice := intArr[1:3]
	// fmt.Println("intArr的元素为", intArr)
	// fmt.Println("slice的元素为", slice)
	// fmt.Println("slice的长度为", len(slice))
	// fmt.Println("slice的容量为", cap(slice ))
	// fmt.Println("数组下标为1的地址值为", &intArr[1])
	// fmt.Println("切片下标为0的地址值为", &slice[0])

	//use make to define a slice
	// var slice []float64 = make([]float64, 5, 10)
	// slice[1] = 10
	// slice[3] = 30
	// fmt.Println(slice)
	// fmt.Println("长度为", len(slice))
	// fmt.Println("容量为", cap(slice))

	// fmt.Println()
	//the third way to define a slice
	//直接就指定具体数组，使用原理类似make的方式
	// var strSlice []string = []string{"tom", "rose", "jack"}
	// fmt.Println("strSlice=", strSlice)
	// fmt.Println("长度", len(strSlice))
	// fmt.Println("容量为", cap(strSlice))

	//切片遍历方式
	//first way traditional iterate
	// for i := 0; i < len(strSlice); i++ {
	// 	fmt.Printf("下标=%d,值=%v\n", i, strSlice[i])
	// }
	//second way
	// for index, value := range strSlice {
	// 	fmt.Printf("index = %d,value = %v\n", index, value)
	// }

	//切片能继续切片
	// var intArr01 [5]int = [...]int{10, 20, 30, 40, 50}
	// slice01 := intArr01[1:4] // 包含下标1不包含下标4 =>[20,30,40]
	// slice02 := slice01[1:2]  //[20,30,40] ==> [30]
	// slice02[0] = 100         //intArr01、slice01、slice02 指向的数据空间是同一个，所以一起改变了
	// fmt.Println("intArr01=", intArr01)
	// fmt.Println("slice01=", slice01)
	// fmt.Println("slice02=", slice02)

	//use innerfunc "append" to append a slice
	// slice03 := []int{100, 200, 300}
	// slice03 = append(slice03, 400, 500, 600)
	// fmt.Println("slice03=", slice03)
	// fmt.Println("slice03[0]的内存地址=", &slice03[0]) // 0xc00000a450
	// slice03 = append(slice03, slice03...)
	// fmt.Println("now slice03=", slice03)
	// fmt.Println("now slice03[0]的内存地址=", &slice03[0]) //0xc00005c060 两次不一样因为底层有newArr的操作

	//use "copy" func to copy a slice
	fmt.Println()
	// slice04 := []int{1, 2, 3, 4, 5}
	// copy(slice04)
	// qwqw
	
}
